/*
 * 1. promise 是一个类, 执行类的时候传递一个执行器, 执行器会立刻执行
 * 2. Promise 有三个状态: fulfilled(成功), rejected(失败), pending(等待)
 *    pending → fulfilled
 *    pending → reject
 *    一旦状态改变后就不可更改
 * 3. resolve 和 reject 用来改变状态
 *    resolve → fulfilled
 *    reject → rejected
 * 4. then 方法做的事就是判断状态, 如果状态是成功, 调用成功的回调, 反之调用失败的状态
 * 5. then 成功后有一个表示成功之后的值,
 * 6. 同一个 promise 对象下面的 then 方法是可以被调用多次的
 * 7. then 方法可以被链式调用, 后面 then 方法的回调函数拿到的值是上一个 then 方法的回调函数的返回值
 * */
const MyPromise = require("./MyPromise");

const promise = new MyPromise((resolve, reject) => {
  setTimeout(() => {
    // resolve("success");
    // return 100;
    reject("failed");
  }, 1000);
  // resolve("success");
  // reject("failed");
});

// 6. 同一个 promise 对象下面的 then 方法是可以被调用多次的
// promise.then(
//   (value) => {
//     console.log(1, value);
//   },
//   (value) => {
//     console.log(value);
//   }
// );
// promise.then(
//   (value) => {
//     console.log(2, value);
//   },
//   (value) => {
//     console.log(value);
//   }
// );
// promise.then(
//   (value) => {
//     console.log(3, value);
//   },
//   (value) => {
//     console.log(value);
//   }
// );

// 7. then 方法可以被链式调用, 后面 then 方法的回调函数拿到的值是上 一个 then 方法的回调函数的返回值
// function other() {
//   return new myPromise((resolve) => {
//     resolve("other");
//   });
// }
//
// promise.then((value) => {
// 	console.log(value);
// 	return other();
// }).then((value) => {
// 	console.log(value);
// });

// 如果自己返回自己, 则报错
/*let p1 = promise.then((value) => {
  console.log(value);
  return p1;
});

p1.then((value) => {
  console.log(value.message);
});*/

// 异步状态下的then
/*
promise
  .then(
    (value) => {
      console.log(1, value);
      return 555;
    },
    (value) => {
      console.log("1e", value);
      throw new Error("then error");
      // return 10000;
    }
  )
  .then(
    (value) => {
      console.log(2, value);
    },
    (value) => {
      console.log("2e", value.message);
    }
  );
*/

// 将 then 的方法变成可选参数
// promise
//   .then()
//   .then()
//   .then(
//     (value) => {
//       console.log(value);
//     },
//     (value) => {
//       console.log(value);
//     }
//   );

// all
function p1() {
  return new MyPromise((resolve, reject) => {
    setTimeout(() => {
      // resolve("success");
      resolve("p1");
    }, 1000);
  });
}
function p2() {
  return new MyPromise((resolve, reject) => {
    // setTimeout(() => {
    //   // resolve("success");
    //   // resolve("p2");
    //   reject("p2");
    // }, 1000);
    // resolve("p2");
    reject("failed");
  });
}

// MyPromise.all(["a", "b", p1(), p2(), "c"]).then(
//   (value) => {
//     console.log(value);
//   },
//   (value) => {
//     console.log(value);
//   }
// );

// resolve
// MyPromise.resolve(100).then((value) => console.log(value));
// MyPromise.resolve(p1()).then((value) => console.log(value));

// finally
// p2()
//   .finally(() => {
//     console.log("finally");
//     return p1();
//   })
//   .then(
//     (value) => {
//       console.log(value);
//     },
//     (value) => {
//       console.log(value);
//     }
//   );

function p2() {
  return new MyPromise(function (resolve, reject) {
    // reject("失败");
    resolve("成功");
  });
}

p2()
  .then((value) => console.log(value))
  .catch((reason) => console.log(reason));
